package no.ntnu.idi.deid.patternmatching.search.dictionary.medicalcodes;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Map.Entry;

import no.ntnu.idi.deid.config.FilePaths;
import no.ntnu.idi.deid.documentunits.Token;
import no.ntnu.idi.deid.searchresultunits.CategoryTag;
import no.ntnu.idi.deid.searchresultunits.Tag;

/*
 * 
 *  ***************************ICPC2****************************
 * ICPC2Codes-mappet har en liste med strenger til hver kode fordi en kode kan ha flere beskrivelser. Den første beskrivelsen i en gitt liste sier noe om hovedtema.
 * Dermed kan det bli behov for å returnere noe mer enn en categorytag på søk for å finne riktig description. Noe må gjøres.
 * 
 * NB: Noen beskrivelser har også (M) og (K) som angir hhv. mann og kvinne. Dette kan også legges til etter hvert.
 * http://www.kith.no/templates/kith_WebPage____1189.aspx
 * 
 * En annen mulig utvidelse er å hente icpc2-labler fra ICD-10 fordi det virker som at de lablene generaliserer temaet mye bedre.
 * 
 */


public class ICPC2_Codes {
	
	private static Map<String, ArrayList<String>> ICPC2Codes;

	//private static int testCounter = 0;
	
	private ICPC2_Codes() {
		if(ICPC2Codes==null){
			try {
				readAndMakeICPC2Codes();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}}
	}
	
	/**
	 * Searches the map for ICPC2Codes
	 * @param t The token to be searched
	 * @return a <code>CategoryTag</code> containing a ICPC2 <code>Tag</code> and the first description in the matching list. Returns null if the token not is a ICPC2 code
	 * 
	 */
	public static CategoryTag searchICPC2Code(Token t) {
		new ICPC2_Codes();
		if(ICPC2Codes.containsKey(t.getStripped())){
			CategoryTag tag = new CategoryTag(Tag.ICPC2);
			tag.setValues(t.getStripped(), ICPC2Codes.get(t.getStripped()).get(0));
			return tag;
		}
		return null;
	}
	
	private void readAndMakeICPC2Codes() throws FileNotFoundException{
		ICPC2Codes = new HashMap<String,ArrayList<String>>();
		Scanner sc = new Scanner(new File(FilePaths.getICPC2CodesPath()));
		while(sc.hasNext()){
			String line = sc.nextLine().trim();
			if(!line.trim().isEmpty() && !line.contains("$")){handleLine(line);}
		}
		sc.close();
	}
	
	private void handleLine(String line){
//		testCounter++;
		int firstComma = line.indexOf(",");
		String code = line.substring(0, firstComma).trim();
		String desc = line.substring(firstComma+1).trim();
		if(ICPC2Codes.containsKey(code)){
			ICPC2Codes.get(code).add(desc);
		}
		else{
			ArrayList<String> list = new ArrayList<String>();
			list.add(desc);
			ICPC2Codes.put(code, list);
		}
	}
	
	
	public static CategoryTag searchExactICPC2Description(String str) {
		new ICPC2_Codes();
		Iterator<Entry<String, ArrayList<String>>> it =  ICPC2Codes.entrySet().iterator();
		while(it.hasNext()){
			Map.Entry<String, ArrayList<String>> entry = (Map.Entry<String, ArrayList<String>>) it.next();
			ArrayList<String> list = entry.getValue();
			for(String desc: list) {
				if(desc.equals(str.trim())) {
					CategoryTag tag = new CategoryTag(Tag.ICPC2);
					tag.setValues(entry.getKey(), desc);
					return tag;
				}
			}
		}
		return null;
	}
}
